package _11_Polymorphic;
/**
 * java 面向对象特征 :
 * 抽象 : 根据具体事务抽象出来的概念/标准,与之对应的是类和接口
 * 封装 : 对事物/对象的属性进行包装
 * 继承 : 为了类复用的一种语法结构O
 * 多态 : 父类引用指向子类对象
 * 
 * 多态相关知识 :
 * 	软件设计六大原则 :
 * 		里氏替换原则 : 能够使用父类的地方,一定可以使用子类
 * 		多态就是里氏替换原则的一种体现
 * 
 * 多态前提条件 : 有继承关系
 * 
 * 		父类引用指向子类对象
 * 			引用 : 引用类型变量
 * 			指向 : 就是通过这个引用类型的变量保存的内存地址,可以找到谁
 * 			子类对象 : 就是使用子类创建的对象
 * 		使用父类类型声明一个变量,这个变量保存子类对象的内存地址
 * 
 * 哪里有变量,哪里就能发生多态
 * 多态的几种形式:
 * 	1.局部变量/成员变量 : 声明的时候使用父类声明,赋值的时候,使用子类对象
 * 	2.实参/形参 : 参数列表使用父类声明, return 的时候返回子类对象
 * 	3.返回值 : 返回值类型使用父类声明, return 的时候返回子类对象
 * 
 * Animal a ://声明一个变量,不是多态
 * a = new Animal(); 父类引用指向父类对象,不是多态
 * a = new Cat(); 父类引用指向子类对象,多态
 * 多态发生在赋值的时候
 * 
 * 多态缺点 :
 * 	丢失子类特有的属性
 * 
 * 父类 变量名 = new 子类();
 * 		1.如果父类没有,不管子类有没有,不管什么属性,都访问不了,报错
 * 		2.如果父类有的成员方法,子类也有的成员方法,执行子类,因为覆写
 * 		3.如果父类有的成员方法,子类没有,执行父类
 * 		4.如果父类有的非成员方法,不管子类有没有,都执行父类
 * @author lenovo
 * @Date 2020年7月10日
 * @Time 下午6:41:37
 */
public class Poly_01 {

	public static void main(String[] args) {
		Sup sup = new Sub();
		sup.m1();
		System.out.println(sup.i);
//		System.out.println(sup.a);
		// 父类引用指向子类对象,父类没有变量 a 就会报错
	}

}

class Sup {
	int i = 10;

	public void m1() {
		System.out.println("父类成员方法");
	}
}

class Sub extends Sup {
	int i = 20;
	int a = 1;

	public void m1() {
		System.out.println("子类成员方法");
	}
}